package lx4;

import java.util.Random;

/*
           微信中的抢红包也用到了多线程。
           假设：100块，分成了3个包，现在有5个人去抢。
           其中，红包是共享数据。
           5个人是5条线程。
           打印结果如下：
               XXX抢到了XXX元
               XXX抢到了XXX元
               XXX抢到了XXX元
               XXX没抢到
               XXX没抢到
       */
public class Mythread extends Thread {
    //共享数据
    //100块，分成了3个包
    static double money = 100;
    static int count = 3;
    //设置最小的中奖金额
    static final double MIN = 0.01;

    @Override
    public void run() {
        //同步代码块
        synchronized (Mythread.class) {
            //判断共享数据是否到了末尾（已经到了末尾）
            if (count == 0) {
                System.out.println(getName() + "没有抢到红包！");
            } else {
                /*
                不能随机随机
                现在有100元
                第一次随机从100里面随机一个金额 比如说50
                第二次随机就要从剩下来的50元里面随机  比如说30
                第三次随机就直接把剩下的的20元当做抽取到的红包即可 没必要随机了
                 */
                //判断共享数据是否到了末尾（还没有到了末尾）

                //定义一个变量，表示抽到红包的金额
                double price = 0;
                if (count == 1) {
                    //表示最后一个红包
                    //就无需随机 ，剩下的所有的钱都是中奖金额
                    price = money;
                } else {
                    //表示第一次或者第二次抽取红包（随机）
                    Random r = new Random();
                    //现在有100元  3个红包
                    //第一次最多抽取99.98 因为还剩下2个红包要抽取，最小金额是0.01元
                    //100-(3-1）*0.01=99.98
                    double bounds = money - (count - 1) * MIN;
                    price = r.nextDouble(bounds) + MIN;//不包括抽取金额为0 所以加上最小金额0.01  0.01-99.99 不包括99.99

                }
                //从money当中，去掉当前中奖的金额
                money -= price;
                //红包的个数-1
                count--;
                //本次红包的信息进行打印
                System.out.println(getName() + "抢到了" + price + "元");
            }
        }

    }
}
